/**
 * 自定义对象的配置文件，存储全部以对象的形式进行。属于一个比较大的 json。存储于MongoDB中。
 * 每一条记录就是一个实体。拿到这个实体的json后，进行解析。然后在新表格中进行查找数据，或者新建数据。
 */

var mongodb = require("./db.ts");
var ObjectID = require("mongodb").ObjectID;
/**
 * 所有实体的入口
 * @param icon 实体图标
 * @param name 实体名称、可以是中文，也可以是其他文字。可以是数字也可以是字母 String
 * @param apiKey 唯一可以识别该实体的字符串。类似于主键。String
 * @param belongId 实体的唯一id，>1000是自定义实体。从0---1000是标准实体。
 * @param props 所有配置字段的集合，JSON
 * @param state 辅助配置信息的集合，JSON
 * @param busiType 业务类型
 */
function ObjectConfig(icon, name, apiKey, belongId, props, state, busiType) {
  this.icon = icon;
  this.name = name;
  this.apiKey = apiKey;
  this.belongId = belongId;
  this.props = props;
  this.state = state;
  this.busiType = busiType;
}
//------------------------------------增--------------------------------------
//保存单个实体。创建单个实体
ObjectConfig.prototype.save = function (dataBaseName,callback) {
  var object = {
    icon: this.icon,
    name: this.name,
    apiKey: this.apiKey,
    belongId: Number.parseInt(this.belongId), //必须是数字
    props: this.props,
    state: this.state,
    busiType: this.busiType,
  };
  //打开数据库
  mongodb.connect(function (err) {
    if (err) {
      return callback(err);
      //错误，返回 err 信息
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      //生成一个实体配置信息
      collection.insert(object, { safe: true }, function (err, ob) {
        if (err) {
          return callback(err);
        }
        callback(null);
      });
    });
  });
};
//------------------------------------查--------------------------------------
//获取所有实体的配置信息
ObjectConfig.getObjects = function (databaseName,callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(databaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      var query = {};
      //根据 query 对象查询文章
      collection
        .find(query)
        .sort({ time: -1 })
        .toArray(function (err, objects) {
          if (err) {
            return callback(err); //失败！返回 err
          }
          callback(null, objects); //成功！以数组形式返回查询的结果
        });
    });
  });
};

//获取所有标准实体
ObjectConfig.getStandardObjects = function (dataBaseName,callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      //查询 belongId <= 1000 的记录：
      var query = {
        belongId: { $lte: 1000 },
      };
      //根据 query 对象查询文章
      collection
        .find(query)
        .sort({ time: -1 })
        .toArray(function (err, objects) {
          if (err) {
            return callback(err); //失败！返回 err
          }
          callback(null, objects); //成功！以数组形式返回查询的结果
        });
    });
  });
};
//获取所有自定义实体
ObjectConfig.getCustomizeObjects = function (dataBaseName,callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      //查询 belongId > 1000 的记录
      var query = { belongId: { $gt: 1000 } };
      //根据 query 对象查询文章
      collection
        .find(query)
        .sort({ time: -1 })
        .toArray(function (err, objects) {
          if (err) {
            return callback(err); //失败！返回 err
          }
          callback(null, objects); //成功！以数组形式返回查询的结果
        });
    });
  });
};

//根据id获取某个固定实体信息
ObjectConfig.findById = function (id,dataBaseName, callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      var query = { _id: "" };
      if (id) {
        query._id = ObjectID(id);
      }
      //根据 query 对象查询文章
      collection.findOne(query, function (err, ob) {
        if (err) {
          return callback(err); //失败！返回 err
        }
        callback(null, ob); //成功！以数组形式返回查询的结果
      });
    });
  });
};
//根据apiKey获取某个固定实体配置
ObjectConfig.findByApiKey = function (apiKey,dataBaseName, callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      var query = { apiKey: "" };
      if (apiKey) {
        query.apiKey = apiKey;
      }
      //根据 query 对象查询文章
      collection.findOne(query, function (err, ob) {
        if (err) {
          return callback(err); //失败！返回 err
        }
        callback(null, ob); //成功！以数组形式返回查询的结果
      });
    });
  });
};
//------------------------------------删--------------------------------------
ObjectConfig.deleteById = function (id,dataBaseName, callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      var query = { _id: "" };
      if (id) {
        query._id = ObjectID(id);
      }
      //根据 query 对象查询文章
      collection.findOne(query, function (err, ob) {
        if (err) {
          return callback(err); //失败！返回 err
        }
        let apiKey = ob.apiKey;
        collection.deleteOne(query);
        console.log("[findOne]", ob);
        callback(null, apiKey); //删除成功
      });
    });
  });
};

ObjectConfig.deleteByApiKey = function (apiKey,dataBaseName, callback) {
  //打开数据库
  mongodb.connect((error) => {
    if (error) {
      throw error;
    }
    const DataBase = mongodb.db(dataBaseName); // 获取数据库
    DataBase.collection("ObjectConfig", function (err, collection) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      collection.remove({ apiKey: apiKey });
      callback(null, apiKey); //删除成功
    });
  });
};

//------------------------------------改--------------------------------------

ObjectConfig.update = function (id, object,dataBaseName, callback) {
  (object.belongId = Number.parseInt(object.belongId)), //必须是数字
    //打开数据库
    mongodb.connect(function (err) {
      if (err) {
        return callback(err);
        //错误，返回 err 信息
      }
      const DataBase = mongodb.db(dataBaseName); // 获取数据库
      DataBase.collection("ObjectConfig", function (err, collection) {
        if (err) {
          return callback(err);
          //错误，返回 err 信息
        }
        //生成一个实体配置信息
        collection.update(
          { _id: ObjectID(id) },
          { $set: object },
          function (err) {
            if (err) {
              return callback(err);
            }
            callback(null);
          }
        );
      });
    });
};

module.exports = ObjectConfig;
